﻿/*
SINACOR - BMF&Bovespa
Arquivo: CamposObrigatoriosNegocioAlocadoDireto.cs
Criado em: 14-mai-2010 17:57:05
Arquiteto Responsável: p-dmartinelli
*/
using System;
using System.Collections.Generic;
using System.Text;
using Sinacor.Infra.Common.Validation;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Validation;
using Sinacor.Infra.Service.Validation.BusinessRules;
using Sinacor.Servico.Bovespa.Alocacao.BusinessEntity;
using Sinacor.Servico.Bovespa.Alocacao.BusinessEntity.Enum;


namespace Sinacor.Servico.Bovespa.Alocacao.BusinessLogic.BusinessRuleValidation
{
    public class CamposObrigatoriosNegocioAlocadoDireto : BaseBusinessRuleValidation<NegocioAlocadoDireto>, IBusinessRuleValidation
    {
        #region Atributos
        private int _clienteDirecionadoNaoZero = 520005;
        private int _dvClienteDirecionadoInvalido = 520006;
        private int _erroObjetoNulo = 314816;
        private int _usuarioDirecionadoNaoZero = 520004;
        #endregion
        #region Propriedades
        public int ClienteDirecionadoNaoZero
        {
            get { return _clienteDirecionadoNaoZero; }
            set { _clienteDirecionadoNaoZero = value; }
        }

        public int DVClienteDirecionadoInvalido
        {
            get { return _dvClienteDirecionadoInvalido; }
            set { _dvClienteDirecionadoInvalido = value; }
        }

        public int ErroObjetoNulo
        {
            get { return _erroObjetoNulo; }
            set { _erroObjetoNulo = value; }
        }

        public int UsuarioDirecionadoNaoZero
        {
            get { return _usuarioDirecionadoNaoZero; }
            set { _usuarioDirecionadoNaoZero = value; }
        }
        #endregion
        #region Métodos
        public List<ValidationError> GetErrors()
        {
            return base.ErrorsList;
        }

        public void Validate()
        {
            if (base.EntityToValidate != null)
            {
                SinacorValidation validador = new SinacorValidation();
                validador.AddValidation<BusinessEntity.NegocioAlocadoDireto>(EntityToValidate);
                validador.AddValidation<BusinessEntity.DadosAlocacao>(EntityToValidate.DadosAlocacao);
                validador.Validate();

                if (EntityToValidate.DadosAlocacao.Dolar == null ||
                    EntityToValidate.DadosAlocacao.Dolar == 0)
                    EntityToValidate.DadosAlocacao.Dolar = 1;

                if (EntityToValidate.DadosAlocacao.Direcionado != null &&
                    EntityToValidate.DadosAlocacao.Direcionado.TipoLiquidacao == TipoLiquidacao.Custodiante)
                {
                    if (!EntityToValidate.DadosAlocacao.Direcionado.Usuario.HasValue ||
                         EntityToValidate.DadosAlocacao.Direcionado.Usuario.Value <= 0)
                    {
                        base.AddValidationError(UsuarioDirecionadoNaoZero);
                        return;
                    }

                    if (!EntityToValidate.DadosAlocacao.Direcionado.Cliente.HasValue ||
                         EntityToValidate.DadosAlocacao.Direcionado.Cliente.Value <= 0)
                    {
                        base.AddValidationError(ClienteDirecionadoNaoZero);
                        return;
                    }

                }

                if (EntityToValidate.DadosAlocacao.Direcionado != null &&
                    EntityToValidate.DadosAlocacao.Direcionado.Cliente.HasValue)
                {
                    Cliente.BusinessEntity.Parameter.ValidarDigitoVerifClienteInstitucional request = new Cliente.BusinessEntity.Parameter.ValidarDigitoVerifClienteInstitucional();
                    request.CodigoClienteInstitucional = EntityToValidate.DadosAlocacao.Direcionado.Cliente;
                    request.CodigoUsuarioInstitucional = EntityToValidate.DadosAlocacao.Direcionado.Usuario;
                    request.DigitoVerifUsuarioInstitucional = EntityToValidate.DadosAlocacao.Direcionado.DigitoVerificadorCliente;
                    Cliente.BusinessLogic.Cliente bl = new Cliente.BusinessLogic.Cliente();
                    ValidationResult response = bl.ValidarDigitoVerifClienteInstitucional(request);
                    if (!response.IsValid)
                        base.AddValidationError(DVClienteDirecionadoInvalido);
                }

            }
            else
                base.AddValidationError(ErroObjetoNulo);

        }
        #endregion
    }

}